package com.security.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

import com.security.demo.service.CustomUserService;

/**
 * 配置security的配置 自定义Spring Security的时候我们需要继承自WebSecurityConfigurerAdapter来完成，相关配置重写对应 方法即可。 
 * @author cj
 *
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{

	/*
	 * 让spring加载一个UserDetailsService类的bean
	 */
	@Bean
    UserDetailsService customUserService() {
        return new CustomUserService();
    }
	
	/*
	 * 然后通过重写configure(AuthenticationManagerBuilder auth) 方法添加我们自定义的认证方式。 
	 */
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		//将查询到的用户进行验证
		auth.userDetailsService(customUserService());
	}
	
	/*
	 * 在configure(HttpSecurity http)方法中，我们设置了登录页面，而且登录页面任何人都可以访问，然后设置了登录失败地址。也可以用loginout()添加注销页面
	 * permitAll()表示该请求任何人都可以访问，.anyRequest().authenticated(),表示其他的请求都必须要有权限认证。
	 * .antMatchers("/admin/**").hasRole("ROLE_ADMIN")设置只用ADMIN角色能够访问/admin/**的文件
	 */
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		//设置security4.x.x版本csrf关闭。
		http.csrf().disable();
		
		//设置只有admin角色能访问/admin/**下面的文件。其它的不能访问。
		http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN")
		    //任何访问都需要权限验证
		    .anyRequest().authenticated()
		    .and()
		    //表单提交
			.formLogin()
			//自定义登录页面
			.loginPage("/admin/login.html").permitAll() //设置/admin/login.html路径不拦截
			//登录时表单提交的action路径
			.loginProcessingUrl("/doLogin").permitAll() //设置/doLogin不拦截
			//设置登录成功时的默认跳转界面
		    .defaultSuccessUrl("/admin/index.html")
		    //设置登录失败时的跳转页面
			.failureUrl("/admin/login.html");
		
	}
	
}
